package test;

public class UpdateBoard {
	//1.周围没雷，修改为'B',递归展开
    //2.周围有雷，不展开，显示周围雷的数量
    //3.遇到雷，直接返回
    int m,n;
    boolean[][] visit;
    int[] dx={0,0,1,-1,-1,1,-1,1};
    int[] dy={1,-1,0,0,-1,1,1,-1};
    //返回[i,j]位置周围雷的个数
    public int checkMine(char[][] board,int i,int j){
        int cnt=0;
        for(int k=0;k<8;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x>=0&&y>=0&&x<m&&y<n&&board[x][y]=='M'){
                cnt++;
            }
        }
        return cnt;
    }

    public void dfs(char[][] board,int i,int j){
        int tmp=checkMine(board,i,j);
        //更新[i,j]位置
        board[i][j]=tmp==0?'B':(char)('0'+tmp);
        for(int k=0;k<8;k++){
            int x=i+dx[k],y=j+dy[k];
            //去下一个坐标的条件： 1.未被访问 2.[i,j]位置无雷 
            if(x>=0&&y>=0&&x<m&&y<n&&visit[x][y]==false&&tmp==0){
                visit[x][y]=true;
                dfs(board,x,y);
            }
        }
    }
    public char[][] updateBoard(char[][] board, int[] click) {
    	//点到雷了，更新直接返回
        if(board[click[0]][click[1]]=='M'){
            board[click[0]][click[1]]='X';
            return board;
        }
        m=board.length;
        n=board[0].length;
        visit=new boolean[m][n];
        int i=click[0],j=click[1];
        visit[i][j]=true;
        dfs(board,i,j);
        return board;
    }
}
